package com.itheima.d4_reflect_field;

import org.junit.Test;

import java.lang.reflect.Field;

/**
    目标：反射获取成员变量: 取值和赋值。

    Field的方法：给成员变量赋值和取值
        void set(Object obj, Object value)：给对象注入某个成员变量数据
        Object get(Object obj):获取对象的成员变量的值。
        void setAccessible(true);暴力反射，设置为可以直接访问私有类型的属性。
        Class getType(); 获取属性的类型，返回Class对象。
        String getName(); 获取属性的名称。
 */
public class FieldDemo02 {
    @Test
    public void setField() throws Exception {
        Student s1 = new Student();
//        s1.name = "张三"; //'name' has private access in 'com.itheima.d4_reflect_field.Student'

        // a.反射第一步，获取类对象
        Class<Student> cls = Student.class;
        // b.提取某个成员变量
        Field nameField = cls.getDeclaredField("name");
        //要给s1对象的name字段设置值为张三
        // 暴力打开权限
        nameField.setAccessible(true);
        // c.赋值
        nameField.set(s1,"张三");
        // d、取值
        //获取s1对象中name字段的值
        Object name = nameField.get(s1);
        System.out.println("name = " + name);
    }



    @Test
    public void staticField() throws NoSuchFieldException, IllegalAccessException {
        //静态字段可以直接使用类名访问
        Student.schoolName = "中国";
        System.out.println(Student.schoolName);

        Class<Student> cls = Student.class;
        Field f1 = cls.getDeclaredField("schoolName");
        System.out.println("f1 = " + f1);

        f1.set(null, "中华人民共和国");
        Object value = f1.get(null);
        System.out.println("value = " + value);


//        //反射能否改变final的值 ---> 不能
//        Field f2 = cls.getDeclaredField("COUNTRY");
//        f2.set(null, "xxx"); //报错：java.lang.IllegalAccessException: Can not set static final java.lang.String field com.itheima.d4_reflect_field.Student.COUNTRY to java.lang.String
//        System.out.println(Student.COUNTRY);
    }
}
